#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

// 标准输入、输出、错误的句柄关闭后会被分配给其他使用
int main(int argc, char** argv)
{
	system("echo -n 1: && ls -l /proc/self/fd ");
	printf("close stdout\n");
	close(1);

	printf("should not see this msg\n");
	system("ls -l /proc/self/fd > tmp");

	int fdtmp;
	// 关闭后，如果打开其他文件描述符，1会分配给其他使用
	// 这会导致库或其他地方输出到stdout的内容输出到该文件描述符，从而产生错误
	if (argc > 1)
		fdtmp = open("tmp", O_WRONLY | O_APPEND, 0666);
	//printf("fd: %d\n", fd);

	// 关闭后，如果1号文件描述符没有分配其他使用，可以重新打开
	// /dev/stdout -> /proc/self/fd/1，关闭后，这个软连接不存在了，打开/dev/stdout失败
	// /proc/self/fd/1 -> /dev/pts/21
	int fdout = open("/dev/pts/21", O_WRONLY);
	if (fdout < 0)
		perror("open");

	printf("now you can see msg again, fdout: %d fd: %d\n", fdout, fdtmp);
	system("echo -n 3: && ls -l /proc/self/fd");

	return 0;
}
